from django.db import models
from django.core.validators import MinLengthValidator

from utils.models import ModelBase


class Tag(ModelBase):
    """
    Create tag database
    """
    name = models.CharField(max_length=64, verbose_name="标签名", help_text="标签名")

    class Meta:
        ordering = ['-update_time', 'id']
        db_table = "tb_tag"  # 指明数据库表名
        verbose_name = "新闻标签"  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        return self.name


class News(ModelBase):
    """
    Create news database
    django.db.models 中的 on_delete 存在以下设置值：

    CASCADE
    级联删除默认值。

    PROTECT
    阻止删除 django.db.IntegrityError 的子类 ProtectedError 引用的对象。

    SET_NULL
    设置 ForeignKey 为空。只有 null 为 True 时才可设置。

    SET_DEFAULT
    设置 ForeignKey 的默认值，而且必须得设置。

    SET()
    设置 ForeignKey 的值传递给 SET() ，并允许可调用的对象调用它。大多数情况下通过调用是必要的，这样可以避免执行查询时models.py被导入。

    def get_sentinel_user():
        return User.objects.get_or_create(username='deleted')[0]

    class MyModel(models.Model):
        user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))

    DO_NOTHING
    不采取任何行动。如果你的数据库后端强制引用完整性，这将导致 IntegrityError 错误，除非手动添加SQL数据库中的 ON DELETE  字段进行约束。
    """
    title = models.CharField(max_length=150, validators=[MinLengthValidator(1), ], verbose_name="标题", help_text="标题")
    digest = models.CharField(max_length=200, validators=[MinLengthValidator(1), ], verbose_name="摘要", help_text="摘要")
    content = models.TextField(verbose_name="内容", help_text="内容")
    clicks = models.IntegerField(default=0, verbose_name="点击量", help_text="点击量")
    image_url = models.URLField(default="", verbose_name="图片url", help_text="图片url")

    tag = models.ForeignKey('Tag', on_delete=models.SET_NULL, null=True)
    author = models.ForeignKey('users.Users', on_delete=models.SET_NULL, null=True)

    class Meta:
        ordering = ['-update_time', '-id']
        db_table = "tb_news"  # 指明数据库表名
        verbose_name = "新闻"  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        return self.title


class Comments(ModelBase):
    """
    Create comments database
    """
    content = models.TextField(verbose_name="内容", help_text="内容")

    author = models.ForeignKey('users.Users', on_delete=models.SET_NULL, null=True)
    news = models.ForeignKey('News', on_delete=models.CASCADE)
    # null=True parent may be null, blank=True web may be null
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)

    def to_dict_data(self):
        comment_dict = {
            'news_id':self.news_id,
            'content_id':self.id,
            'content':self.content,
            'author':self.author.username,
            'update_time':self.update_time,
            'parent':self.parent.to_dict_data() if self.parent else None,
        }

        return comment_dict

    class Meta:
        ordering = ['-update_time', '-id']
        db_table = "tb_comments"  # 指明数据库表名
        verbose_name = "评论"  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        return '<评论{}>'.format(self.id)


class HotNews(ModelBase):
    """
    Create HotNews database
    """
    PRI_CHOISCES =[
        (1, '第一级'),
        (2, '第二级'),
        (3, '第三级'),
    ]

    news = models.OneToOneField('News', on_delete=models.CASCADE)
    priority = models.IntegerField(choices=PRI_CHOISCES, default=3, verbose_name="优先级", help_text="优先级")

    class Meta:
        ordering = ['-update_time', '-id']
        db_table = "tb_hotnews"  # 指明数据库表名
        verbose_name = "热门新闻"  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        return '<热门新闻{}>'.format(self.id)


class Banner(ModelBase):
    """
    Create Banner database
    """
    PRI_CHOISCES =[
        (1, '第一级'),
        (2, '第二级'),
        (3, '第三级'),
        (4, '第四级'),
        (5, '第五级'),
        (6, '第六级'),
    ]

    image_url = models.URLField(verbose_name="轮播图url", help_text="轮播图url")
    priority = models.IntegerField(choices=PRI_CHOISCES, default=6, verbose_name="优先级", help_text="优先级")
    news = models.OneToOneField('News', on_delete=models.CASCADE)

    class Meta:
        ordering = ['priority', '-update_time', '-id']
        db_table = "tb_banner"  # 指明数据库表名
        verbose_name = "轮播图"  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        return '<轮播图{}>'.format(self.id)
